/**
 * @file queue.h
 * @author 玄绮 (shijiahansi@qq.com)
 * @brief 
 * @version 0.1
 * @date 2021-06-25
 * 
 * @copyright Copyright (c) 2021
 * 
 */

#ifndef __QUEUE_H__
#define __QUEUE_H__
#include "ds_common.h"

typedef struct Queue_Node Queue_Node;
typedef Queue_Node *PQueue_Node;
typedef const Queue_Node *CPQueue_Node;

typedef struct Queue Queue;
typedef Queue *PQueue;
typedef const Queue *CPQueue;

struct Queue_Node
{
    PQueue_Node next;
    PData_Val data;
};

PQueue queue_Creat(int sizeof_type);

void queue_destory(PQueue thisc);

//返回 queue 中第一个元素的引用。如果 queue 是常量，就返回一个常引用；如果 queue 为空，返回值是未定义的。
PData_Val queue_front(PQueue thisc, PData_Val data);

//返回 queue 中最后一个元素的引用。如果 queue 是常量，就返回一个常引用；如果 queue 为空，返回值是未定义的。
PData_Val queue_back(PQueue thisc);

//T& obj)：在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
void queue_push(PQueue thisc, PData_Val data);

//删除 queue 中的第一个元素。
void queue_pop(PQueue thisc);

//返回 queue 中元素的个数。
long queue_size(PQueue thisc);

//如果 queue 中没有元素的话，返回 true。
bool queue_empty(PQueue thisc);

//的参数调用 T 的构造函数，在 queue 的尾部生成对象。
//将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap()
void swap(PQueue thisc, PQueue q);

#endif//__QUEUE_H__